package com.yunmai.library.util;

import android.util.Log;
import java.math.BigDecimal;
import java.util.IllegalFormatException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 数据类型转换 ：
 * float  to int
 * float 保留多少位小数
 */
public class DataUtil {

  private static final int DEFAULT_INT = 0;
  private static final double DEFAULT_DOUBLE = 0;
  private static final float DEFAULT_FLOAT = 0;

  /**
   * 验证手机号
   *
   * @return boolean
   */
  public static boolean isMobileNO(String mobiles) {
    String regex = "^[1][2,3,4,5,6,7,8,9][0-9]{9}$";
    return match(regex, mobiles);
  }

  /**
   * 验证字符串是否符合email格式
   *
   * @param email 需要验证的字符串
   * @return 如果字符串为空或者为Null返回true，
   * 如果不为空或Null则验证其是否符合email格式，符合则返回true,不符合则返回false
   */
  public static boolean isEmail(String email) {
    boolean flag = true;
    if (!(email == null || email.trim().length() < 1)) {
      flag = email.matches("[a-zA-Z0-9\\+\\.\\_\\%\\-\\+]{1,256}" + "\\@"
          + "[a-zA-Z0-9][a-zA-Z0-9\\-\\_]{0,64}" + "(" + "\\."
          + "[a-zA-Z0-9][a-zA-Z0-9\\-\\_\\.]{0,25}" + ")+");
      return flag;
    }
    return flag;
  }

  public static boolean isPwdValid(String pwd) {
    if (StringUtils.isNotNull(pwd)) {
      return pwd.length() >= 6;
    }
    return false;
  }

  /**
   * @param regex 正则表达式字符串
   * @param str 要匹配的字符串
   * @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;
   */
  private static boolean match(String regex, String str) {
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(str);
    return matcher.matches();
  }

  public static int weightToBmr(float weight, float height, float age, int sex) {
    int bmr;
    if (sex == 1) {
      bmr = (int) (10 * weight + 6.25 * height - 5 * age + 5);
    } else {
      bmr = (int) (10 * weight + 6.25 * height - 5 * age - 161);
    }
    if (bmr > 100) {    //后两位置零
      bmr = bmr / 100 * 100;
    }
    return bmr;
  }

  /**
   * 保留多少文小数 ：使用四舍五入
   * float value:要转换的值
   * int len:要保留位数
   */
  public static float toFloat(float value, int len) {
    if (Float.isNaN(value) || value == 0.0) {
      return 0.0f;
    }
    BigDecimal b = new BigDecimal(value + "");
    return b.setScale(len, BigDecimal.ROUND_HALF_UP).floatValue();
  }

  /**
   * int  to  float ：使用四舍五入
   * float value:要转换的值
   * int len:要保留位数
   */
  public static float intToFloat(int value, int len) {
    try {
      BigDecimal b = new BigDecimal(value);
      return b.setScale(len, BigDecimal.ROUND_HALF_UP).floatValue();
    } catch (NumberFormatException e) {
      return Float.valueOf(value).floatValue();
    }
  }

  /**
   * 保留多少文小数 ：使用四舍五入
   * float value:要转换的值
   * int len:要保留位数
   */
  public static String floatToStr(int value, int len) {
    BigDecimal b = new BigDecimal((float) value / 10);
    return String.valueOf(b.setScale(len, BigDecimal.ROUND_HALF_UP).floatValue());
  }

  /**
   * float 类型数值转字符串
   *
   * @return String
   */
  public static String floatToString(float value, int len) {
    BigDecimal b = new BigDecimal(value);
    return String.valueOf(b.setScale(len, BigDecimal.ROUND_HALF_UP).floatValue());
  }

  /**
   * float 类型数值转字符串,不适用四舍五入
   *
   * @return String
   */
  public static String floatToStringDown(float value, int len) {
    // BigDecimal b = new BigDecimal(value);
    // return String.valueOf(b.setScale(len, BigDecimal.ROUND_DOWN).floatValue());

    String[] strs = String.valueOf(value).split("\\.");
    StringBuffer valueString = new StringBuffer();
    if (strs.length > 1 && strs[1].length() >= len) {
      valueString.append(strs[0]).append(".");
      String subStr = String.valueOf(strs[1]).substring(0, len);
      valueString.append(subStr);
    }

    return valueString.toString();
  }

  /**
   * double 类型数值转字符串,不适用四舍五入
   *
   * @return String
   */
  public static String doubleToStringDown(double value, int len) {
    BigDecimal b = new BigDecimal(value);
    return String.valueOf(b.setScale(len, BigDecimal.ROUND_DOWN).doubleValue());
  }

  /**
   * 小数转换成整数 ：：使用四舍五入
   * float value:要转换的值
   */
  public static int toInt(float value) {
    try {
      BigDecimal b = new BigDecimal(value + "");
      return b.setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
    } catch (Exception e) {

    }
    return 0;
  }

  /**
   * 字符串转
   * int value:要转换的值
   */
  public static int toInt(String value, int empty) {
    try {
      return Integer.valueOf(value);
    } catch (Exception e) {
      Log.e("DataUtil", e.toString());
    }
    return empty;
  }

  /**
   * 四舍五入的转Int
   *
   * @param value 要强转的值
   * @param empty 强转失败值
   */
  public static int toIntRound(final float value, int empty) {
    try {
      return toInt(value);
    } catch (IllegalFormatException e) {
      e.printStackTrace();
    }
    return empty;
  }

  /**
   * 小数转换成整数 ：：使用四舍五入
   * float value:要转换的值
   */
  public static String floatToStr(float value) {
    return String.valueOf(toInt(value));
  }

  /**
   * 字符串转浮点类型，如果转换失败则返回默认值
   *
   * @return float
   */
  public static float strToFloat(String str) {
    return strToFloat(str, 0);
  }

  /**
   * * 字符串转浮点类型，如果转换失败则返回默认值
   *
   * @return float
   */
  public static float strToFloat(String str, float defaultFloat) {
    try {
      float result = Float.valueOf(str);
      return result;
    } catch (Exception e) {
      Log.e("DataUtil", e.getMessage());
    }
    return defaultFloat;
  }

  /**
   * string转int，默认返回DEFAULT_INT
   */
  public static int getInteger(String str) {
    return getInteger(str, DEFAULT_INT);
  }

  /**
   * string转int
   */
  public static int getInteger(String str, int defaultInt) {
    if (!isDigit(str, 0)) {
      return defaultInt;
    }
    Integer integer;
    integer = Integer.valueOf(str);
    return integer.intValue();
  }

  /**
   * string转double，默认返回DEFAULT_DOUBLE
   */
  public static double getDouble(String str) {
    return getDouble(str, DEFAULT_DOUBLE);
  }

  /**
   * string转double
   */
  public static double getDouble(String str, double defaultDouble) {
    if (!isDecimal(str)) {
      return defaultDouble;
    }
    Double mDouble;
    mDouble = Double.valueOf(str);
    return mDouble.doubleValue();
  }

  /**
   * string转float，默认返回DEFAULT_FLOAT
   */
  public static float getFloat(String str) {
    return getFloat(str, DEFAULT_FLOAT);
  }

  /**
   * string转float
   */
  public static float getFloat(String str, float defaultFloat) {
    if (!isDecimal(str)) {
      return defaultFloat;
    }
    Float mFloat;
    mFloat = Float.valueOf(str);
    return mFloat.floatValue();
  }

  /**
   * 验证是否为数字
   *
   * @param number 需要验证的数字字符串
   * @param count 数字的位数，若传0，表示不判断个数
   */
  private static boolean isDigit(String number, int count) {
    boolean isValid = false;
    if (number == null) {
      return isValid;
    }

    String expression = "[0-9]{" + count + "}";
    if (count <= 0) {
      expression = "[0-9]+";
    }
    CharSequence inputStr = number;

    Pattern pattern = Pattern.compile(expression);

    Matcher matcher = pattern.matcher(inputStr);

    if (matcher.matches()) {
      isValid = true;
    }

    return isValid;
  }

  /**
   * 验证是否为数字或小数
   *
   * @param str 需要验证的数字字符串
   */
  private static boolean isDecimal(String str) {
    boolean isValid = false;
    if (str == null) {
      return isValid;
    }

    String expression = "[\\-0-9\\.]+";
    CharSequence inputStr = str;

    Pattern pattern = Pattern.compile(expression);

    Matcher matcher = pattern.matcher(inputStr);

    if (matcher.matches()) {
      isValid = true;
    }

    return isValid;
  }

  public static int getAge(int birthday) {
    int age = 0;
    //最大有效年龄为100岁
    if (birthday > (DateHelper.getCurrentDateNum() - 1000000)) {
      age = DateHelper.getCurrentYearNum()
          - DateHelper.dateToNumYear(DateHelper.StrToDate(String.valueOf(birthday),
          EnumDateFormatter.DATE_NUM));
      //还未过出生月年龄-1
      if (DateHelper.dateToNumMonth(DateHelper.getCurrentDate()) < DateHelper.dateToNumMonth(
          DateHelper.StrToDate(String.valueOf(birthday),
              EnumDateFormatter.DATE_NUM))) {
        age--;
      } else if (DateHelper.dateToNumMonth(DateHelper.getCurrentDate())
          == DateHelper.dateToNumMonth(
          DateHelper.StrToDate(String.valueOf(birthday),
              EnumDateFormatter.DATE_NUM))) {
        if (DateHelper.dateToNumDay(DateHelper.getCurrentDate()) < DateHelper.dateToNumDay(
            DateHelper.StrToDate(String.valueOf(birthday),
                EnumDateFormatter.DATE_NUM))) {
          age--;
        }
      }
      if (age < 1) {
        age = 1;
      }
    }
    return age;
  }
}
